package wxwoa

import (
	"crypto/sha1"
	"io"
	"sort"

	// "encoding/json"
	// "io/ioutil"
	// "strings"
	"fmt"
	// "net/http"

	"github.com/kataras/iris/v12"
)

// WxTokenCheckController WxTokenCheckController 页面
type WxTokenCheckController struct {
	// https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html

	// Optionally: context is auto-binded by Iris on each request,
	// remember that on each incoming request iris creates a new UserController each time,
	// so all fields are request-scoped by-default, only dependency injection is able to set
	// custom fields like the Service which is the same for all requests (static binding).
	Ctx iris.Context
}

// GetTokencheck Token 检测地址
func (c *WxTokenCheckController) GetTokencheck() {
	const token string = "19901108"
	/*
		开发者提交信息后，微信服务器将发送GET请求到填写的服务器地址URL上，GET请求携带参数如下表所示
		参数		描述
		signature	微信加密签名，signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
		timestamp	时间戳
		nonce		随机数
		echostr		随机字符串
		开发者通过检验signature对请求进行校验（下面有校验方式）。
		若确认此次GET请求来自微信服务器，请原样返回echostr参数内容，则接入生效，成为开发者成功，否则接入失败。
		加密/校验流程如下：
		1）将token、timestamp、nonce三个参数进行字典序排序
		2）将三个参数字符串拼接成一个字符串进行sha1加密
		3）开发者获得加密后的字符串可与signature对比，标识该请求来源于微信
	*/

	signature := c.Ctx.URLParam("signature")
	timestamp := c.Ctx.URLParam("timestamp")
	nonce := c.Ctx.URLParam("nonce")
	echostr := c.Ctx.URLParam("echostr")

	// ctx.Application().Logger().Infof("signature: %s", signature)

	// step 1
	list := []string{token, timestamp, nonce}
	sort.Strings(list)
	// step 2
	t := sha1.New()
	for _, values := range list {
		io.WriteString(t, values)
	}
	checkInfo := fmt.Sprintf("%x", t.Sum(nil))
	// step 3
	if checkInfo == signature {

		// 保存 wxconfig 以方便给 js-sdk 使用
		wxconfig := WxConfig{
			AppID:     WeChatSubscriptionAppID(c.Ctx),
			Timestamp: timestamp,
			NonceStr:  nonce,
			Signature: signature,
		}
		wxconfig.SaveToCache()

		c.Ctx.WriteString(echostr)
		return
	}

	c.Ctx.WriteString("非法请求")
}
